package JDK8新特性_集合.Stream流的创建;

import java.util.*;
import java.util.stream.Stream;

public class Test {
    public static void main(String[] args) {
        // 获取Stream流: public interface Stream<T> ...{}
        // 1. 获取集合的Stream流: 方法: default Stream<E> stream()    获取当前集合对象的Stream流
        // 2. 获取数组的Stream流:
        // a. Arrays类提供的方法: public static <T> Stream<T> stream(T[] array)   获取当前数组的Stream流
        // b. Stream类提供的方法: public static<T> Stream<T> of(T... values)    获取当前接收数据的Stream流

        // 如何获取list集合的Stream流
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "张三丰", "张无忌", "周芷若", "赵敏", "张强");
        Stream<String> stream = list.stream();

        // 如何获取Set集合的Stream流
        Set<String> set = new HashSet<>();
        Collections.addAll(set, "刘德华", "张曼玉", "蜘蛛精", "马德", "德玛西亚");
        Stream<String> stream1 = set.stream();
        stream1.filter(s -> s.contains("德")).forEach(System.out::println);

        // 如何获取Map集合的Stream流
        Map<String, Double> map = new HashMap<>();
        map.put("古力娜扎", 172.3);
        map.put("迪丽热巴", 168.3);
        map.put("马儿扎哈", 166.3);
        map.put("卡尔巴哈", 168.3);
        // map集合是不可以直接调用Stream()方法的, Stream()方法是由Collection提供的, 故map不可以直接使用.
        // 可以把键值对分为两部分来使用Stream流
        Set<String> key = map.keySet();
        Stream<String> ks = key.stream(); // 键
        Collection<Double> values = map.values();
        Stream<Double> stream2 = values.stream();// 值
        // 也可以整体处理,要用到entries
        Set<Map.Entry<String, Double>> entries = map.entrySet();
        Stream<Map.Entry<String, Double>> stream3 = entries.stream(); // 键和值
        stream3.filter(s -> s.getKey().contains("巴")).forEach(s -> System.out.println(s.getKey() + "-->" + s.getValue()));

        // 如何获取数组的Stream流
        String[] name = {"张翠山", "东方不败", "堂大山", "孤独求败"};
        // a. 可以用Arrays类提供的方法
        Stream<String> stream4 = Arrays.stream(name);
        // b. 可以用Stream类提供的方法
        Stream<String> Stream5 = Stream.of(name);
    }
}